﻿Imports Microsoft.Reporting.WinForms
Imports DAL
Imports System.Globalization

Public Class UCChoixRapport

    Private listeEmployes As New List(Of Employe)

    ''Fonction qui permet d'activer ou désactiver les dates d'intervalle
    'Private Sub ChkIntervalle_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    '    If ChkIntervalle.Checked = True Then
    '        DtpDébut.Enabled = True
    '        DtpFin.Enabled = True
    '    Else
    '        ErrVal.SetError(DtpDébut, "")
    '        DtpDébut.Enabled = False
    '        DtpFin.Enabled = False
    '    End If
    'End Sub

    ''Permet d'enlever l'erreur sur le choix de rapport
    'Private Sub CboRapports_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CboRapports.SelectedIndexChanged
    '    ErrVal.SetError(CboRapports, "")
    '    If TabControl1.TabPages.Count = 0 Then
    '        TabControl1.TabPages.Add(TabPage1)
    '        TabControl1.TabPages.Add(TabPage2)
    '    End If
    'End Sub

    Private Sub RemplirListeAnnee()
        For i As Integer = Date.Today.Year To 1980 Step -1
            CboAnneeDeb.Items.Add(i.ToString())
            CboAnneeFin.Items.Add(i.ToString())
        Next
        CboAnneeDeb.SelectedIndex = 0
        CboAnneeFin.SelectedIndex = 0
    End Sub

    ''Gestion des rapports
    'Private Sub BtnAfficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAfficher.Click
    '    'Validation des choix
    '    If CboRapports.Text = "--Veuillez choisir un rapport--" Then
    '        ErrVal.SetError(CboRapports, "Veuillez choisir un rapport.")
    '        Exit Sub
    '    ElseIf ChkIntervalle.Checked = True And DtpDébut.Value >= Today Then
    '        ErrVal.SetError(DtpDébut, "Veuillez entrer la date de début inférieur a aujourd'hui ou décocher l'intervalle.")
    '        Exit Sub
    '    ElseIf ChkIntervalle.Checked = True And DtpDébut.Value >= DtpFin.Value Then
    '        ErrVal.SetError(DtpDébut, "")
    '        ErrVal.SetError(DtpFin, "Veuillez entrer la date de fin inférieur a la date de début.")
    '        Exit Sub
    '    Else
    '        ErrVal.SetError(DtpFin, "")
    '        ErrVal.SetError(DtpDébut, "")
    '    End If

    '    'Création des variables du rapport choisi
    '    Dim début As Date
    '    Dim fin As Date
    '    Dim texte As String = ""
    '    Dim connec As String = (From x In bd.Employes Where x.ID = empConnecte.id Select x.Nom + ", " + x.Prenom).First

    '    'Gestion de l'intervalle de temps
    '    If ChkIntervalle.Checked = True Then
    '        début = DtpDébut.Value
    '        fin = DtpFin.Value
    '        'texte = "Du: " + début.Day + "/" + début.Month + "/" + début.Year + " Au: " + fin.Day + "/" + fin.Month + "/" + fin.Year
    '        texte = "Du: " + début.ToString("dd\/MM\/yyyy") + " Au: " + fin.ToString("dd\/MM\/yyyy")
    '    End If

    '    'Début de la génération des rapports
    '    Using frm As New FrmRapports

    '        Select Case CboRapports.SelectedItem

    '            'Génération du rapport Liste des employés
    '            
    '            Case "Nombres d'heures par plages"
    '                'création de la liste d'éléments
    '                Dim liste As New List(Of DAL.PlageHoraire)

    '                'Choix de la requête selon la présence de l'intervalle
    '                If texte <> "" Then
    '                    liste = (From x In bd.PlageHoraires Select x Where x.Date >= début And x.Date <= fin).ToList()
    '                Else
    '                    texte = ""
    '                    liste = (From x In bd.PlageHoraires Select x).ToList()
    '                End If

    '                'Création du rapport
    '                If liste.Count <> 0 Then
    '                    Dim listHeures As New List(Of HeureTravaille)
    '                    For Each horaire In liste
    '                        Dim Heure As New HeureTravaille(horaire.Duree, horaire.Date, horaire.Nom)
    '                        listHeures.Add(Heure)
    '                    Next
    '                    frm.SetRapport("RapportHeurePlage.rdlc", listHeures, "HeurePlage")
    '                    Dim params(1) As ReportParameter
    '                    params(0) = frm.CreerParametre("Entete", texte)
    '                    params(1) = frm.CreerParametre("NomUtil", connec)
    '                    frm.SetParametre(params)
    '                    frm.ShowDialog()
    '                Else
    '                    MsgBox("Aucune plage est défini sur cet intervalle")
    '                End If

    '                'Génération du rapport Nombres d'heures par plages
    '            Case "Nombres d'heures par plages pour chaque employés"
    '                'création de la liste d'éléments
    '                Dim liste As New List(Of DAL.PlageHoraire)

    '                'Choix de la requête selon la présence de l'intervalle
    '                If texte <> "" Then
    '                    liste = (From x In bd.PlageHoraires Select x Where x.Date >= début And x.Date <= fin).ToList()
    '                Else
    '                    texte = ""
    '                    liste = (From x In bd.PlageHoraires Select x).ToList()
    '                End If

    '                'Création du rapport
    '                If liste.Count <> 0 Then
    '                    Dim listHeures As New List(Of HeureTravaille)
    '                    For Each horaire In liste
    '                        Dim Heure As New HeureTravaille(horaire.Employe1.ID, horaire.Employe1.Nom + ", " + horaire.Employe1.Prenom,
    '                        horaire.Date, horaire.Duree, horaire.Nom)
    '                        listHeures.Add(Heure)
    '                    Next
    '                    frm.SetRapport("RapportPlageEmp.rdlc", listHeures, "PlageEmp")
    '                    Dim params(1) As ReportParameter
    '                    params(0) = frm.CreerParametre("Entete", texte)
    '                    params(1) = frm.CreerParametre("NomUtil", connec)
    '                    frm.SetParametre(params)
    '                    frm.ShowDialog()
    '                Else
    '                    MsgBox("Aucun employé a travaillé sur cet intervalle")
    '                End If

    '                'Ajout de rapports
    '                'Case ""

    '        End Select
    '    End Using
    'End Sub

    Private Sub UCChoixRapport_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TabControl1.TabPages.Remove(TabPage1)
        'TabControl1.TabPages.Remove(TabPage2)
        RemplirListeAnnee()
        CboMoisDeb.SelectedIndex = Date.Today.Month - 1
        CboMoisFin.SelectedIndex = Date.Today.Month - 1
        CboRapports.SelectedIndex = 0
    End Sub

    Private Sub RemplireListes()
        listeEmployes.Clear()
        Using dbc As New BDCarpeDiemDataContext
            If Rb_ListEmp.Checked Then
                Dim selectedID As New List(Of Integer)
                For Each itm As ListViewItem In Lv_SelectionEmp.Items
                    selectedID.Add(Convert.ToInt32(itm.Tag))
                Next
                listeEmployes = (From x In dbc.Employes Where selectedID.Contains(x.ID) And (x.Supprime = False Or x.Supprime = CkbDonneeSup.Checked) Order By x.Nom, x.Prenom Select x).ToList()
            Else
                listeEmployes = (From x In dbc.Employes Where x.Supprime = False Or x.Supprime = CkbDonneeSup.Checked Order By x.Nom, x.Prenom Select x).ToList()
            End If
        End Using

    End Sub

    Private Sub Btn_SelectEmp_Click(sender As System.Object, e As System.EventArgs) Handles Btn_SelectEmp.Click
        Using dbc As New BDCarpeDiemDataContext
            Using diag As New FrmEmployePicker
                Dim selectedID As New List(Of Integer)
                For Each itm As ListViewItem In Lv_SelectionEmp.Items
                    selectedID.Add(Convert.ToInt32(itm.Tag))
                Next
                diag.InclureSupprimer = CkbDonneeSup.Checked
                diag.SelectedEmployes = (From x In dbc.Employes Where (x.Supprime = False) _
                                    AndAlso selectedID.Contains(x.ID) Select x).ToList()
                If diag.ShowDialog() = Windows.Forms.DialogResult.OK Then
                    Lv_SelectionEmp.Items.Clear()
                    For Each emp In diag.SelectedEmployes
                        Dim itm As New ListViewItem(emp.Nom.TrimStart() + ", " + emp.Prenom)
                        itm.Tag = emp.ID
                        Lv_SelectionEmp.Items.Add(itm)
                    Next
                End If
            End Using
        End Using
    End Sub

    Private Sub Rb_Employe_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles Rb_ListEmp.CheckedChanged, Rb_AllEmp.CheckedChanged
        Btn_SelectEmp.Enabled = Rb_ListEmp.Checked
        Lv_SelectionEmp.Enabled = Rb_ListEmp.Checked

    End Sub

    Private Sub RbAnnee_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles RbSemaine.CheckedChanged, RbMois.CheckedChanged, RbIntMois.CheckedChanged, RbIntAnnee.CheckedChanged, RbAnnee.CheckedChanged, RbDebut.CheckedChanged
        ErrVal.Clear()
        If RbAnnee.Checked Then
            LblAnneeDeb.Visible = True
            LblAnneeFin.Visible = False
            LblMoisDeb.Visible = False
            LblMoisFin.Visible = False
            LblA.Visible = False
            CboMoisDeb.Visible = False
            CboMoisFin.Visible = False
            CboAnneeDeb.Visible = True
            CboAnneeFin.Visible = False
            UcCalendrier1.Visible = False
        ElseIf RbIntAnnee.Checked Then
            LblAnneeDeb.Visible = True
            LblAnneeFin.Visible = True
            LblMoisDeb.Visible = False
            LblMoisFin.Visible = False
            LblA.Visible = True
            CboMoisDeb.Visible = False
            CboMoisFin.Visible = False
            CboAnneeDeb.Visible = True
            CboAnneeFin.Visible = True
            UcCalendrier1.Visible = False
        ElseIf RbMois.Checked Then
            LblAnneeDeb.Visible = True
            LblAnneeFin.Visible = False
            LblMoisDeb.Visible = True
            LblMoisFin.Visible = False
            LblA.Visible = False
            CboMoisDeb.Visible = True
            CboMoisFin.Visible = False
            CboAnneeDeb.Visible = True
            CboAnneeFin.Visible = False
            UcCalendrier1.Visible = False
        ElseIf RbIntMois.Checked Then
            LblAnneeDeb.Visible = True
            LblAnneeFin.Visible = True
            LblMoisDeb.Visible = True
            LblMoisFin.Visible = True
            LblA.Visible = True
            CboMoisDeb.Visible = True
            CboMoisFin.Visible = True
            CboAnneeDeb.Visible = True
            CboAnneeFin.Visible = True
            UcCalendrier1.Visible = False
        ElseIf RbSemaine.Checked Then
            LblAnneeDeb.Visible = False
            LblAnneeFin.Visible = False
            LblMoisDeb.Visible = False
            LblMoisFin.Visible = False
            LblA.Visible = False
            CboMoisDeb.Visible = False
            CboMoisFin.Visible = False
            CboAnneeDeb.Visible = False
            CboAnneeFin.Visible = False
            UcCalendrier1.Visible = True
        ElseIf RbDebut.Checked Then
            LblAnneeDeb.Visible = False
            LblAnneeFin.Visible = False
            LblMoisDeb.Visible = False
            LblMoisFin.Visible = False
            LblA.Visible = False
            CboMoisDeb.Visible = False
            CboMoisFin.Visible = False
            CboAnneeDeb.Visible = False
            CboAnneeFin.Visible = False
            UcCalendrier1.Visible = False
        End If
    End Sub

    Private Sub BtnGenerer_Click(sender As System.Object, e As System.EventArgs) Handles BtnGenerer.Click
        ErrVal.Clear()
        RemplireListes()
        Dim dateDebut, dateFin As Date
        Dim txtEntete As String = String.Empty
        'Calcul de l'intrevalle du rapport
        If RbAnnee.Checked Then
            dateDebut = New Date(Convert.ToInt32(CboAnneeDeb.Text), 1, 1)
            dateFin = dateDebut.AddYears(1)
            dateFin = dateFin.AddDays(-1)
            Console.WriteLine(dateDebut.ToString() + " " + dateFin.ToString())
            txtEntete = "Rapport de l'année " + CboAnneeDeb.Text
        ElseIf RbIntAnnee.Checked Then
            If Convert.ToInt32(CboAnneeDeb.Text) >= Convert.ToInt32(CboAnneeFin.Text) Then
                ErrVal.SetError(CboAnneeDeb, "Veuillez choisir une année de départ inférieure à celle de fin.")
                Return
            End If
            dateDebut = New Date(Convert.ToInt32(CboAnneeDeb.Text), 1, 1)
            dateFin = New Date(Convert.ToInt32(CboAnneeFin.Text) + 1, 1, 1)
            dateFin = dateFin.AddDays(-1)
            Console.WriteLine(dateDebut.ToString() + " " + dateFin.ToString())
            txtEntete = "Rapport de l'année " + CboAnneeDeb.Text + " à " + CboAnneeFin.Text
        ElseIf RbMois.Checked Then
            dateDebut = New Date(Convert.ToInt32(CboAnneeDeb.Text), CboMoisDeb.SelectedIndex + 1, 1)
            dateFin = dateDebut.AddMonths(1)
            dateFin = dateFin.AddDays(-1)
            Console.WriteLine(dateDebut.ToString() + " " + dateFin.ToString())
            txtEntete = "Rapport du mois de " + CboMoisDeb.Text + " " + CboAnneeDeb.Text
        ElseIf RbIntMois.Checked Then
            If (Convert.ToInt32(CboAnneeDeb.Text) = Convert.ToInt32(CboAnneeFin.Text) And CboMoisDeb.SelectedIndex >= CboMoisFin.SelectedIndex) _
                Or (Convert.ToInt32(CboAnneeDeb.Text) > Convert.ToInt32(CboAnneeFin.Text)) Then
                ErrVal.SetError(CboAnneeDeb, "Veuillez choisir un mois de départ inférieur à mois de fin.")
                Return
            End If
            dateDebut = New Date(Convert.ToInt32(CboAnneeDeb.Text), CboMoisDeb.SelectedIndex + 1, 1)
            dateFin = New Date(Convert.ToInt32(CboAnneeFin.Text), CboMoisFin.SelectedIndex + 1, 1).AddMonths(1)
            dateFin = dateFin.AddDays(-1)
            Console.WriteLine(dateDebut.ToString() + " " + dateFin.ToString())
            txtEntete = "Rapport du mois de " + CboMoisDeb.Text + " " + CboAnneeDeb.Text + " à " + CboMoisFin.Text + " " + CboAnneeFin.Text
        ElseIf RbSemaine.Checked Then
            dateDebut = UcCalendrier1.Value
            dateFin = UcCalendrier1.Value.AddDays(7)
            dateFin = dateFin.AddSeconds(-1)
            Console.WriteLine(dateDebut.ToString() + " " + dateFin.ToString())
            txtEntete = "Rapport de la semaine du " + dateDebut.Day.ToString + " " + dateDebut.ToString("MMMM", CultureInfo.GetCultureInfo("fr-CA")) + " " + dateDebut.Year.ToString
        ElseIf RbDebut.Checked Then
            'txtEntete = ""
        End If

        Select Case CboRapports.SelectedIndex
            Case 0 'liste employés
                Dim empDansRapport As New List(Of Employe)
                If RbDebut.Checked Then
                    empDansRapport = (From x In bd.Employes Where listeEmployes.Contains(x) Select x).ToList()
                Else
                    empDansRapport = (From x In bd.Employes Where x.DateEmbauche >= dateDebut And x.DateEmbauche <= dateFin And listeEmployes.Contains(x) Select x).ToList()
                End If
                Dim listeEmpRap As New List(Of EmployesRapport)
                For Each emp In empDansRapport
                    Dim empR As New EmployesRapport()
                    With emp
                        empR.ID = .ID
                        empR.NomEmploye = .Nom + ", " + .Prenom
                        empR.Poste = .Poste
                        empR.DateNais = IIf(.DateNaissance.HasValue, .DateNaissance, Date.Now)
                        empR.DateEmbauche = IIf(.DateEmbauche.HasValue, .DateEmbauche, Date.Now)
                        empR.Adresse = .Adresse
                        If Not .Ville1 Is Nothing Then
                            empR.Ville = IIf(.Ville.HasValue, .Ville1.Nom, String.Empty)
                        End If

                        empR.CodePostal = .CodePostal
                    End With
                    listeEmpRap.Add(empR)
                Next
                If listeEmpRap.Count > 0 Then
                    Using frm As New FrmRapports()
                        frm.SetRapport("RapportListeEmp.rdlc", listeEmpRap, "ListeEmp")
                        Dim params(1) As ReportParameter
                        params(0) = frm.CreerParametre("Entete", txtEntete)
                        params(1) = frm.CreerParametre("NomUtil", empConnecte.nom)
                        frm.SetParametre(params)
                        frm.ShowDialog()
                    End Using
                Else
                    MessageBox.Show("Il n'y a aucun employé dans cette période de temps.")
                End If

            Case 1 'liste bénéficiaires
                Dim listeBen As New List(Of DAL.Beneficiaire)
                If RbDebut.Checked Then
                    listeBen = (From x In bd.Beneficiaires Where x.Supprime = False Or x.Supprime = CkbDonneeSup.Checked _
                            Select x).ToList()
                Else
                    listeBen = (From x In bd.Beneficiaires Where x.DateDebut >= dateDebut And x.DateFin <= dateFin _
                                And (x.Supprime = False Or x.Supprime = CkbDonneeSup.Checked) Select x).ToList()
                End If
                
                Dim listeBenRap As New List(Of BeneficiaireRapport)
                For Each ben In listeBen
                    Dim benR As New BeneficiaireRapport()
                    With ben
                        benR.ID = .ID
                        benR.NomBeneficiaire = .Nom + ", " + .Prenom
                        benR.DateNais = IIf(.DateNaissance.HasValue, .DateNaissance, Date.Now)
                        benR.Resident = IIf(.Resident.HasValue, .Resident, False)
                        benR.Adresse = .Adresse
                        benR.Ville = .Ville1.Nom
                        benR.CodePostal = .CodePostal
                    End With
                    listeBenRap.Add(benR)
                Next
                'Création du rapport
                If listeBenRap.Count > 0 Then
                    Using frm As New FrmRapports()
                        frm.SetRapport("RapportListeBene.rdlc", listeBenRap, "ListeBene")
                        Dim params(1) As ReportParameter
                        params(0) = frm.CreerParametre("Entete", txtEntete)
                        params(1) = frm.CreerParametre("NomUtil", empConnecte.nom)
                        frm.SetParametre(params)
                        frm.ShowDialog()
                    End Using
                Else
                    MessageBox.Show("Il n'y a aucun bénéficiaire dans cette période de temps.")
                End If
            Case 2
                Dim listePlage As New List(Of DAL.PlageHoraire)
                If RbDebut.Checked Then
                    listePlage = (From x In bd.PlageHoraires Where x.Accompagnement = True Select x).ToList()
                Else

                    listePlage = (From x In bd.PlageHoraires Where x.Date >= dateDebut And x.Date <= dateFin And x.Accompagnement = True Select x).ToList()
                End If

                Dim listAccom As New List(Of Accompagnement)
                For Each EmpAccom In listePlage
                    Dim accom As New Accompagnement(EmpAccom.Employe1.ID, EmpAccom.Employe1.Nom + ", " + EmpAccom.Employe1.Prenom,
                    EmpAccom.Beneficiaire1.Nom + ", " + EmpAccom.Beneficiaire1.Prenom, EmpAccom.Date)
                    listAccom.Add(accom)
                Next
                'Création du rapport
                If listAccom.Count > 0 Then
                    Using frm As New FrmRapports()
                        frm.SetRapport("RapportAccom.rdlc", listAccom, "Accom")
                        Dim params(1) As ReportParameter
                        params(0) = frm.CreerParametre("Entete", txtEntete)
                        params(1) = frm.CreerParametre("NomUtil", empConnecte.nom)
                        frm.SetParametre(params)
                        frm.ShowDialog()
                    End Using

                Else
                    MessageBox.Show("Il n'y a aucun accompagnement dans cette période de temps.")
                End If
            Case 3
                Dim listePlage As New List(Of DAL.PlageHoraire)
                If RbDebut.Checked Then
                    listePlage = (From x In bd.PlageHoraires Where listeEmployes.Contains(x.Employe1) Select x).ToList()
                Else

                    listePlage = (From x In bd.PlageHoraires Where x.Date >= dateDebut And x.Date <= dateFin And listeEmployes.Contains(x.Employe1) Select x).ToList()
                End If

                'Création du rapport
                If listePlage.Count <> 0 Then
                    Dim listHeures As New List(Of HeureTravaille)
                    For Each horaire In listePlage
                        Dim Heure As New HeureTravaille(horaire.Employe1.ID, horaire.Employe1.Nom + ", " + horaire.Employe1.Nom,
                        horaire.Date, horaire.Duree)
                        listHeures.Add(Heure)
                    Next
                    Using frm As New FrmRapports()
                        frm.SetRapport("RapportHeureTravail.rdlc", listHeures, "HeureTravail")
                        Dim params(1) As ReportParameter
                        params(0) = frm.CreerParametre("Entete", txtEntete)
                        params(1) = frm.CreerParametre("NomUtil", empConnecte.nom)
                        frm.SetParametre(params)
                        frm.ShowDialog()
                    End Using
                Else
                    MsgBox("Aucun employé a travaillé sur cet intervalle")
                End If
            Case 4
                Dim listePlage As New List(Of DAL.PlageHoraire)
                If RbDebut.Checked Then
                    listePlage = (From x In bd.PlageHoraires Where listeEmployes.Contains(x.Employe1) Select x).ToList()
                Else

                    listePlage = (From x In bd.PlageHoraires Where x.Date >= dateDebut And x.Date <= dateFin And listeEmployes.Contains(x.Employe1) Select x).ToList()
                End If

                'Création du rapport
                If listePlage.Count <> 0 Then
                    Dim listHeures As New List(Of HeureTravaille)
                    For Each horaire In listePlage
                        Dim Heure As New HeureTravaille(horaire.Duree, horaire.Date, horaire.Nom)
                        listHeures.Add(Heure)
                    Next
                    Using frm As New FrmRapports()
                        frm.SetRapport("RapportHeurePlage.rdlc", listHeures, "HeurePlage")
                        Dim params(1) As ReportParameter
                        params(0) = frm.CreerParametre("Entete", txtEntete)
                        params(1) = frm.CreerParametre("NomUtil", empConnecte.nom)
                        frm.SetParametre(params)
                        frm.ShowDialog()
                    End Using
                Else
                    MsgBox("Aucun employé a travaillé sur cet intervalle")
                End If
            Case 5
                Dim listePlage As New List(Of DAL.PlageHoraire)
                If RbDebut.Checked Then
                    listePlage = (From x In bd.PlageHoraires Where listeEmployes.Contains(x.Employe1) Select x).ToList()
                Else
                    listePlage = (From x In bd.PlageHoraires Where x.Date >= dateDebut And x.Date <= dateFin And listeEmployes.Contains(x.Employe1) Select x).ToList()
                End If

                'Création du rapport
                If listePlage.Count <> 0 Then
                    Dim listHeures As New List(Of HeureTravaille)
                    For Each horaire In listePlage
                        Dim Heure As New HeureTravaille(horaire.Employe1.ID, horaire.Employe1.Nom + ", " + horaire.Employe1.Prenom, _
                                                        horaire.Date, horaire.Duree, horaire.Nom)
                        listHeures.Add(Heure)
                    Next
                    Using frm As New FrmRapports()
                        frm.SetRapport("RapportPlageEmp.rdlc", listHeures, "PlageEmp")
                        Dim params(1) As ReportParameter
                        params(0) = frm.CreerParametre("Entete", txtEntete)
                        params(1) = frm.CreerParametre("NomUtil", empConnecte.nom)
                        frm.SetParametre(params)
                        frm.ShowDialog()
                    End Using
                Else
                    MsgBox("Aucun employé a travaillé sur cet intervalle")
                End If
                
        End Select


    End Sub
End Class
